ヘッダーをスキップ
Oracle TimesTen In-Memory Database推奨されたプログラミングの実行
リリース6.0
B25772-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

パフォーマンスを最大にするための推奨事項

この章では、次の推奨事項について説明します。

パフォーマンス重視の直接リンクされたアプリケーションの実行

TimesTenのダイレクトODBCおよびJDBCドライバを使用し、データ・ストアと同一のマシンでアプリケーションを実行すると、TimesTenのパフォーマンスを容易に最大限にできます。他のマシンのアプリケーションが、クライアント/サーバー機能を使用してTimesTenデータ・ストアにアクセスすることは可能ですが、ネットワーク通信量のオーバーヘッドによってパフォーマンスが大幅に低下します。

レプリケーションおよびCache Connect to Oracleを使用すると、クライアント/サーバー・アクセスのオーバーヘッドが発生することなく、データへのローカル・アクセスが可能になります。

注意: クライアント/サーバー・アーキテクチャで動作するTimesTenは、ダイレクト・メモリー・モードのTimesTenほど高速ではありませんが、十分に高速です。TimesTen Client/Serverアプリケーションは、従来のクライアント/サーバー・データベースに接続されたアプリケーションよりもパフォーマンスが優れています。特に、TimesTenは従来のデータベースと比較すると、非常に優れたスループットを実現できます。

次の状況では、アプリケーションは、クライアント/サーバー接続でTimesTenデータ・ストアに接続することを検討する必要があります。

全SQL文の事前準備

最高のパフォーマンスを得るには、複数回実行するSQL文をすべて事前に準備しておく必要があります。これはすべてのリレーショナル・データベースにあてはまります。ただし、TimesTenをきわめて高速なトランザクション率で使用する場合、文のコンパイルに必要な時間が、文の実行に必要な時間の数倍に達する可能性もあります。文の事前準備に加えて、それらの入力パラメータと出力列も事前にバインドしておく必要があります。

ディスクへの書込み頻度の制御

通常のアプリケーションでは、データ・ストアにある程度の永続性が必要です。つまり、ハードウェアまたはソフトウェアの障害が原因でシステムがクラッシュした場合に、データ・ストアへの最新の更新が失われないことが要求されます。DurableCommits接続属性を使用してTimesTenを構成する方法がいくつかあります。

問合せに対する適切な索引の作成

データ・ストアのパフォーマンスを向上させるために、索引をどれくらい作成すればよいのかを判断するのは、少し困難なことです。作成した索引が少なすぎると、頻繁に行うデータ・ストア操作の一部が通常よりも遅くなります。作成した索引が多すぎると、索引の更新に余分な時間が必要になるために、挿入/更新/削除の操作に通常よりも時間がかかります。

TimesTenの表と索引のスキーマを設計する際に、考慮すべき問題がいくつかあります。

例:

SELECT ... FROM T1 WHERE COL1 = ? AND COL2 = ?  
状況1:

T1に次の2つの索引が存在します。

状況2:

T1に次の2つの索引が存在します。

状況3:

T1に次の2つの索引が存在します。

状況4:

T1に次の2つの索引が存在します。

ハッシュ索引: (COL1、COL2、COL3)

Tツリー索引: (COL3、COL1、COL2)

この場合、いずれの索引もこの問合せへの応答に効率的には使用できません。ただし、Tツリー索引は全表スキャンに使用できます。

前述の状況2と同じ理由で、ハッシュ索引は使用できません。問合せの行(COL1、COL2)は索引の先行接頭辞ではないため、Tツリー索引は使用できません。

いずれの索引も使用できないため、データ・ストアは表スキャンを実施して問合せに応答する必要があります(一時索引を作成する場合もあります)。その結果、問合せのパフォーマンスは低下します。

これらの例からわかるように、最も頻繁に行われるデータ・ストアへの問合せに基づいて、どの索引を作成するかを慎重に選択する必要があります。

適切な索引の作成の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の、文のチューニングと索引の使用の項、およびハッシュ索引またはTツリー索引の適切な選択の項を参照してください。

showplanを使用した、問合せに適切な索引が使用されていることの検証

特定の問合せの実行が予想よりも低速である場合、TimesTenのオプティマイザが、問合せの応答に最適な問合せ計画を選択していない可能性があります。問合せによって生成される計画を確認する方法については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の計画の表示の項を参照してください。

自動コミットの無効化および定期的なコミット

ODBCおよびJDBCのデフォルトでは、データ・ストアへのすべての接続は自動コミットが有効になっています。つまり、各SQL文がそれぞれのトランザクションでコミットされます。自動コミットを無効にして、単一のトランザクションで複数のSQL文を明示的にコミットすると、アプリケーションのパフォーマンスを大幅に改善できます。これは、バルク挿入またはバルク削除などの大規模な処理で特に有効です。(TTClassesの場合、自動コミットはデフォルトで無効になっています。)

ただし、単一のトランザクションにあまりにも多くの操作を含めると、ロックが長時間保持されるため、システム全体の同時実行性が低下するおそれがあります。通常、バルク挿入/更新/削除の操作は、数千行ごとにコミットすると、最も効率良く処理できる傾向があります。

C/C++(ODBC)とJava(JDBC)のパフォーマンス

TimesTen固有のAPIはODBCです。TimesTenのJava JDBCドライバは、TimesTenのODBCドライバの最上部に構成されたタイプ2ドライバです。このため、TimesTenのODBCドライバを使用したC/C++アプリケーションは、TimesTenのJDBCドライバを使用したJavaアプリケーションよりも少し高いパフォーマンスを実現できます。最高レベルのパフォーマンスが必要なアプリケーションは、TimesTenのODBCドライバを使用して開発する必要があります。

注意: TimesTenのJDBCドライバはきわめて高速です。TimesTenのJDBCのパフォーマンスも、他のデータベースのJDBCのパフォーマンスより大幅に優れています。TimesTenのJDBCドライバは、TimesTenのODBCドライバよりもわずかに低速ですが、その差は重要です。

ODBCとJDBCとの予想されるパフォーマンス結果の差は、実行した問合せの種類(SELECTまたはUPDATE/INSERT/DELETE)およびトランザクションの構成(読込みから書込みまで)によって異なります。パフォーマンスに影響を与える要素は、次のとおりです。

データ・ロード後の索引作成による大量のデータ・ロードの高速化

アプリケーション設計によっては、データをロードした後にTツリー索引を作成すると、データのロードに要する時間を最小化できます。この場合、次の順序で操作を実行する必要があります。

  1. 表にデータをロードします(ロギングを無効化するかデータ・ストア・レベルのロックを使用すると、表のロード操作中のパフォーマンスが改善されます)。
  2. Tツリー索引を作成します。
  3. 統計を更新します。
  4. 問合せを準備します。
  5. これは大量のデータ・ロード操作(たとえば数百万行)を実行する場合のみを対象としていることに注意してください。

TTClassesの使用(OLEDB / ADO / サード・パーティのミドルウェアの回避)

多くのサード・パーティのデータベース・インタフェース・パッケージでは、データ・ストアのパフォーマンスにペナルティが課せられます。これらのインタフェースは、特定のアプリケーションでパフォーマンスが重要でない場合には使用できますが、ユーザーはパフォーマンスのトレードオフが発生することを認識している必要があります。

これらのサード・パーティのパッケージは低速なことがあるため、TimesTenではTTClassesという独自のC++ ODBCラッパー・クラスを開発しました。これはTimesTenに含まれています。TTClassesの詳細は、『Oracle TimesTen In-Memory Database TTClasses ガイド』を参照してください。